package com.woniuxy.util;
/*
 * @author 幸琦林&&曾令忠
 *
 */

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.Map.Entry;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.crypto.hash.SimpleHash;

import com.woniuxy.dao.FocusDao;
import com.woniuxy.entity.Focus;
import com.woniuxy.entity.User;
import org.springframework.beans.BeanUtils;

public class CommonUtil {
	private final static String info = "***";
//工具类本地测试main方法
	public static void main(String[] args) {

//        CommonUtil commonUtil = new CommonUtil();
//		commonUtil.getMd5Pwd("admin", "123456");
//        commonUtil.getMd5Pwd("abc", "123");


//        System.out.println(Arrays.toString(getFreeTime(57)));
//
		System.out.println("转换数字：" + getFreeSun(new int[]{1, 2, 0, 0, 5, 6}));
//		System.out.println(getFreeSun(new int[]{1, 2, 3, 4, 5}));

//		User user1 = new User().setNickname("abc");
//		User user2 = new User().setNickname("cba");
//		try {
//			BeanUtils.copyProperties(user1, user2);
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		System.out.println(user1);
//		System.out.println(user2);
	}

	public static String getMd5Pwd(String account, String pwd) {
		String md5 = new SimpleHash("MD5", pwd, account, 5).toString();
		String abcNew = new SimpleHash("MD5", md5).toString();
		System.out.println("加密后密码:" + abcNew);
		return abcNew;
	}

	// 工具类方法

	/**
	 * @param daySum:从数据库查出的10进制表示方式
	 * @return 返回一个6长的Boolean数组
	 */
//    计算教练空闲时间
	public static int[] getFreeTime(int daySum) {
        String s = Integer.toBinaryString(daySum);
        char[] cha = s.toCharArray();
        List<Integer> temp = new LinkedList<>();
        for (int i = 0; i < cha.length; i++) {
            if (cha[cha.length - 1 - i] == '1') {
                temp.add(i + 1);
            }
        }
        int[] dayclass = new int[temp.size()];
        for (int i = 0; i < temp.size(); i++) {
            dayclass[i] = temp.get(i);
        }
        return dayclass;
    }

	/**
	 * @param days:提交一个有课数组 样例： {1,4}表示第一节和第四节有课
	 * @return 返回十进制表示方式
	 */
	// 计算课时10进制数字
	public static int getFreeSun(int[] days) {
		int tempI = 0;
		for (int day : days) {
			if (day != 0) {
				tempI += 1 << day - 1;
			}
		}
		return tempI;
	}

	/**
	 * 将得到的users排序，获取最近的n名用户
	 * @author 曾令忠
	 * @param users 查询到的附近的用户集合
	 * @param user  查询条件
	 * @param n     获取n名最近的
	 * @return
	 */
	public static List<User> getNearUser(List<User> users, User user, int n) {
		if (users == null || users.size() == 0) {
			return null;
		}
		System.out.println(users);
		List<Entry<User, Double>> list = new ArrayList<>();
		// 新建一个map存放，user对应的距离
		Map<User, Double> map = new HashMap<>();
		double la1 = user.getLatitude();// 当前用户的latitude
		double lo1 = user.getLongitude();// 当前用户的longitude
		for (User user2 : users) {
			double la2 = user2.getLatitude();// 遍历用户的latitude
			double lo2 = user2.getLongitude();// 遍历用户的longitude
			// 计算距离
			Double distance = Math.sqrt(Math.pow((la1 - la2), 2) + Math.pow((lo1 - lo2), 2));
			//转换成小数点后两位
			DecimalFormat df = new DecimalFormat("#.00");
			distance = Double.valueOf(df.format(distance * 110));
			System.out.println(distance);
			user2.setDistance(distance);
			map.put(user2, distance);
		}
		Set<Entry<User, Double>> set = map.entrySet();
		for (Entry<User, Double> entry : set) {
			list.add(entry);
		}
		// 针对距离当前用户进行排序
		Collections.sort(list, new Comparator<Entry<User, Double>>() {

			@Override
			public int compare(Entry<User, Double> o1, Entry<User, Double> o2) {
				// TODO Auto-generated method stub
				if (o1.getValue() - o2.getValue() > 0) {
					return 1;
				} else if (o1.getValue() - o2.getValue() == 0) {
					return 0;
				}
				return -1;
			}

		});
		// 得到距离最近的n名用户
		List<User> nearUsers = new ArrayList<User>();
		if(list.size()<2) {
			n=list.size();
		}
		for (int i = 0; i < n; i++) {
			nearUsers.add(list.get(i).getKey());
		}
		System.out.println("长度:" + nearUsers.size());
		return nearUsers;
	}

	// 获取当前用户
	public static User getCurrentUser() {
		return (User) SecurityUtils.getSubject().getPrincipal();
	}

	//更新当前用户
	public static void updateCurrentUser(User user) {

		User newUser = (User) SecurityUtils.getSubject().getPrincipal();
		//同步修改session中信息
		newUser.setNickname(user.getNickname());
		newUser.setAvatar(user.getAvatar());
		newUser.setLatitude(user.getLatitude());
		newUser.setLongitude(user.getLongitude());


	}

	public static String getCurrentTime() {
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		return format.format(new Date());
	}

	/**
	 * 针对查询到的好友设置角色名，联系方式等
	 * @author 曾令忠
	 * @param users 查询到的user集合
	 * @return 包装后的user集合
	 */
	public static List<User> setInfo(List<User> users) {
		if(users==null||users.size()==0) {
			return users;
		}
		for (User user : users) {
			//设置角色名
			if("1".equals(user.getRole())) {
				user.setRole("student");
			}else if("2".equals(user.getRole())) {
				user.setRole("coach");
			}else if("3".equals(user.getRole())) {
				user.setRole("gym");
			}
			//好友可见
			if("3".equals(user.getInfoRange())) {
				user.setWechat(info);
				user.setQq(info);
				user.setPhone(info);
			}
		}
		return users;
	}

	/**
	 * 针对查询到的focus根据角色取个角色名，根据inforange改变联系方式
	 *@author 曾令忠
	 * @param fid     当前用户id
	 * @param focuses 查询到的关注集合
	 * @return 包装后的focus集合
	 */
	public static List<Focus> focusSetInfo(long fid, List<Focus> focuses) {
		for (Focus focus : focuses) {
			//改变角色名
			User user = focus.getUser();
			if("1".equals(user.getRole())) {
				user.setRole("student");
			}else if("2".equals(user.getRole())) {
				user.setRole("coach");
			}else if("3".equals(user.getRole())) {
				user.setRole("gym");
			}
			
			//判断关注对象设置的inforange，作出相应处理
			//好友可见
			if("2".equals(user.getInfoRange())) {
				//不是好友
				if("1".equals(focus.getFocusStatus())) {
					user.setWechat(info);
					user.setQq(info);
					user.setPhone(info);
				}
			}else if("3".equals(user.getInfoRange())) {
				user.setWechat(info);
				user.setQq(info);
				user.setPhone(info);
			}
		}
		return focuses;
	}

	/**
	 * 针对查询到的focus根据角色取个角色名，根据inforange改变联系方式
	 * @author 曾令忠
	 * @param fid 当前用户id
	 * @param fd 查询到的关注集合
	 * @return 包装后的focus集合
	 */
	public static List<User> userSetInfo(long fid,List<User> users,FocusDao fd) {
		for (User user : users) {
			//改变角色名
			if("1".equals(user.getRole())) {
				user.setRole("student");
			}else if("2".equals(user.getRole())) {
				user.setRole("coach");
			}else if("3".equals(user.getRole())) {
				user.setRole("gym");
			}
			
			//判断关注对象设置的inforange，作出相应处理
			//好友可见
			if("2".equals(user.getInfoRange())) {
				//不是好友
				String status = fd.getFocusStatus(fid, user.getId());
				if("1".equals(status)) {
					user.setWechat(info);
					user.setQq(info);
					user.setPhone(info);
				}
			}else if("3".equals(user.getInfoRange())) {
				user.setWechat(info);
				user.setQq(info);
				user.setPhone(info);
			}
		}
		return users;
	}
	
	/**
	 * 针对查询到的focus根据角色取个角色名，根据inforange改变联系方式，针对单个用户
	 * @author 曾令忠
	 * @param user user对象
	 * @param fd 查询到的关注集合
	 * @return 包装后的focus集合
	 */
	public static User setInfoByRank(User user,FocusDao fd) {
		//如果是场馆，不做处理
		if("3".equals(user.getRole())) {
			return user;
		}
		//判断关注对象设置的inforange，作出相应处理
		//好友可见
		if("2".equals(user.getInfoRange())) {
			//不是好友
			String status = fd.getFocusStatus(getCurrentUser().getId(), user.getId());
			if("1".equals(status)) {
				user.setWechat(info);
				user.setQq(info);
				user.setPhone(info);
			}
		}else if("3".equals(user.getInfoRange())) {
			user.setWechat(info);
			user.setQq(info);
			user.setPhone(info);
		}
		return user;
	}

}
